public class VarArgsOverloading2 {
    static void f(float i, char... args) {
        System.out.println("float i, char... args, i = " + i);
        for (char c : args) {
            System.out.print(c + " ");
        }
    }

    static void f(char c, Character... args) {
        System.out.println("char c, Character... args , c = " + c);
        for (Character ch : args) {
            System.out.print(ch + " ");
        }
    }

    public static void main(String[] args) {
        // f('a');
        // f('a', 'b');
         f(1, 'a');
    }
}
/*
f('a');
报错
java: 对f的引用不明确
  VarArgsOverloading2 中的方法 f(float,char...) 和 VarArgsOverloading2 中的方法 f(char,java.lang.Character...) 都匹配

解析
Java 的方法重载（overloading）匹配机制并不是只看参数类型，
还要结合参数数量、自动类型转换、装箱拆箱、可变参数（varargs）规则等综合判断。

f(float i, char... args)
第一个参数是 float。
'a' 是 char 类型，可以自动提升为 float（Java 允许从 char 到 int 再到 float）。
后面没有其他参数 → 可以视为长度为 0 的 char[]。
f(char c, Character... args)
第一个参数是 char，正好匹配 'a'。
后面没有参数 → 可以视为长度为 0 的 Character[]。
✅ 所以这两个方法都可以接受调用 f('a')，编译器无法确定该选哪个，导致 ambiguous method call（方法调用歧义）
 */

/*
调用 f('a', 'b') 的匹配过程
'a' 是 char 类型。
'b' 也是 char 类型。

尝试匹配第一个方法：f(float i, char... args)
'a' 可以自动提升为 float（合法）
'b' 是 char，可以作为 char[] 的一部分（合法）
➡️ 所以这个方法可以匹配：i = 'a' → 97.0f, args = {'b'}

尝试匹配第二个方法：f(char c, Character... args)
'a' 完全匹配 char 类型
'b' 可以自动装箱成 Character，然后封装成数组
➡️ 所以这个方法也可以匹配：c = 'a', args = {new Character('b')}
 */